import {
  IsEmail,
  IsString,
  MinLength,
  MaxLength,
  Matches,
} from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';

/**
 * 注册DTO
 * 用于验证注册请求的数据
 */
export class RegisterDto {
  /**
   * 用户名
   * 规则：3-20个字符，只能包含字母、数字、下划线
   */
  @ApiProperty({
    description: '用户名',
    example: 'john_doe',
    minLength: 3,
    maxLength: 20,
  })
  @IsString({ message: '用户名必须是字符串' })
  @MinLength(3, { message: '用户名至少3个字符' })
  @MaxLength(20, { message: '用户名最多20个字符' })
  @Matches(/^[a-zA-Z0-9_]+$/, {
    message: '用户名只能包含字母、数字、下划线',
  })
  username: string;

  /**
   * 邮箱
   */
  @ApiProperty({
    description: '邮箱',
    example: 'john@example.com',
  })
  @IsEmail({}, { message: '邮箱格式不正确' })
  email: string;

  /**
   * 密码
   * 规则：6-20个字符，至少包含字母和数字
   */
  @ApiProperty({
    description: '密码',
    example: 'password123',
    minLength: 6,
    maxLength: 20,
  })
  @IsString({ message: '密码必须是字符串' })
  @MinLength(6, { message: '密码至少6个字符' })
  @MaxLength(20, { message: '密码最多20个字符' })
  @Matches(/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]+$/, {
    message: '密码必须包含字母和数字',
  })
  password: string;
}
